﻿#define _CRT_SECURE_NO_WARNINGS
//分支和循环
//C语言是结构化的程序设计语言，这里的结构指的是顺序结构、选择结构、循环结构，C语言是能够实
//现这三种结构的，其实我们如果仔细分析，我们日常所见的事情都可以拆分为这三种结构或者这三种
//结构的组合。
//我们可以使用 if 、switch 实现分支结构，使用 for 、while 、do while 实现循环结构。
//
//
//
//if 语句的语法形式如下:
//1if (表达式)
//2语句
//
//表达式成立（为真），则语句执行，表达式不成立（为假），则语句不执行
//在C语言中零为假，非零为真。
//也就是表达式的结果如果是0，则语句不执行，表达式的结果如果不
//是0，则语句执行。
//
//
//例子：输入一个整数，判断是否为奇数
//#include <stdio.h>
//int main()
//{
//	int num = 0;//初始化
//	scanf("%d", &num);
//	if (num >= 18)//if 后面不能加;
//	{
//		printf("成年了。\n", num);//默认情况下if和else语句后面只能跟一条语句
//		printf("可以谈恋爱");
//	}
//	else
//	{
//		printf("没成年\n", num);//若想要同时控制多条语句可以用{}
//		printf("不是，哥么你配吗？");
//	}
//
//	return 0;
//}


//else语句
//如果一个数不是奇数，那就是偶数了，如果任意一个整数，我们要清楚的判断是奇数还是偶数怎么表
//示呢？
//这里就需要if...else... 语句了，语法形式如下：
//1if (表达式)
//2语句1
//3else
//4语句2


//嵌套if
//在if else 语句中， else 可以与另一个if 语句连用，构成多重判断。
//比如：要求输入一个整数，判断输入的整数是0，还是正数或者负数。

//第一种
//int main()
//{
//	int num = 0;
//	printf("请输入数字\n");
//	scanf("%d", &num);
//	if (num == 0)
//		printf("输入的数字是0\n");
//
//	else if (num > 0)
//		printf("输入的数字是正数\n");
//	else
//		printf("输入的数字是负数\n");
//
//	return 0;
//
//}
//
//
//第二种
//int main()
//{
//	int num = 0;
//	printf("请输入数字\n");
//	scanf("%d", &num);
//	if (num == 0)
//		printf("输入的数字是0\n");
//
//	else
//
//	{
//		if (num > 0)
//			printf("输入的数字是正数\n");
//		else
//			printf("输入的数字是负数\n");
//	}
//
//	return 0;
//
//}
//
//练习
//
//输入一个人的年龄
//如果年龄 < 18岁，打印"少年"
//	如果年龄在18岁至44岁打印"青年"
//	如果年龄在45岁至59岁打印"中老年"
//	如果年龄在60岁至89岁打印"老年"
//	如果90岁及以上打印"老寿星"



//int main()
//{
//	int num = 0;
//	scanf("%d", &num);
//	if (num < 18)
//		printf("少年\n");
//	else if (num <= 44)
//		printf("青年\n");
//
//	else if (num <= 59)
//		printf("中年人\n");
//
//	else if (num <= 89)
//		printf("老年\n");
//
//	else
//		printf("老寿星\n");
//				
//		return 0;		 
//					 
//		}
	
		
	
	
//悬空else问题
//如果有多个if 和else ，可以记住这样一条规则， else 总是跟最接近的if 匹配。
//只要带上适当的大括号，代码的逻辑就会更加的清晰，所以大家以后在写代码的时候要注意括号的使
//用，让代码的可读性更高。
//
//
//关系操作符
//C 语言用于比较的表达式，称为 “关系表达式”（relational expression），里面使用的运算符就称
//为“关系运算符”（relational operator），主要有下面6个。
//> 大于运算符
//< 小于运算符
//>= 大于等于运算符
//<= 小于等于运算符
//== 相等运算符
//!= 不相等运算符
//
//关系表达式通常返回0 或1 ，表示真假。
//C 语言中， 0 表示假，所有非零值表示真。比如， 20 > 12 返回1 ， 12 > 20 返回0 。
//关系表达式常用于if 或while 结构。
//
//注意：相等运算符 == 与赋值运算符 = 是两个不一样的运算符，不要混淆。有时候，可能会不小心写
//出下面的代码，它可以运行，但很容易出现意料之外的结果。
//
//为了防止出现这种错误，有的程序员喜欢将变量写在等号的右边。
//1 if (3 == x) 
//这样的话，如果把 == 误写成 = ，编译器就会报错。
//
//另一个需要避免的错误是：多个关系运算符不宜连用。
//    i < j < k
//	上面示例中，连续使用两个小于运算符。这是合法表达式，不会报错，但是通常达不到想要的结果，
//	即不是保证变量j 的值在i 和k 之间。因为关系运算符是从左到右计算，所以实际执行的是下面的
//	表达式。
//	 (i < j) < k
//	上面式子中， i < j 返回0 或1 ，所以最终是0 或1 与变量k 进行比较。如果想要判断变量j
//	的值是否在i 和k 之间，应该使用下面的写法。
//	 i < j && j < k
//		
//	
//	条件操作符
//	条件操作符也叫三目操作符，需要接受三个操作数的，形式如下：
//	1 exp1 ? exp2 : exp3
//	条件操作符的计算逻辑是：如果exp1 为真， exp2 计算，计算的结果是整个表达式的结果；如果
//	exp1 为假， exp3 计算，计算的结果是整个表达式的结果。
//
//
//	逻辑操作符：&&, || , ！
//	逻辑运算符提供逻辑判断功能，用于构建更复杂的表达式，主要有下面三个运算符。
//	• !：逻辑取反运算符（改变单个表达式的真假）。
//	•&& ：逻辑与运算符，就是并且的意思（两侧的表达式都为真，则为真，否则为假）。
//	• || ：逻辑或运算符，就是或者的意思（两侧至少有一个表达式为真，则为真，否则为假）。
//	
//	短路
//	C语言逻辑运算符还有一个特点，它总是先对左侧的表达式求值，再对右边的表达式求值，这个顺序是
//	保证的。
//	如果左边的表达式满足逻辑运算符的条件，就不再对右边的表达式求值。这种情况称为“短路”。
//	仅仅根据左操作数的结果就能知道整个表达式的结果，不再对右操作数进行计算的运算称为短
//	路求值。
//
//
//
//	switch 语句
//		除了if 语句外，C语言还提供了switch 语句来实现分支结构。
//		switch 语句是一种特殊形式的 if...else 结构，用于判断条件有多个结果的情况。它把多重
//			的else if 改成更易用、可读性更好的形式。
//
//
//			switch (expression)
//			{
//			case value1: statement
//			case value2: statement
//			default: statement
//			}
//上面代码中，根据表达式expression 不同的值，执行相应的case 分支。如果找不到对应的值，
//就执行 default 分支。
//switch 后的expression 必须是整型表达式
//case 后的值，必须是整形常量表达式
//字符类型也是归类到整形家族
//字符的本质是 ASCII码，这个值是整数
//
//
//注意的点有：
//1. case 和后边的数字之间必须有空格
//2. 每一个case 语句中的代码执行完成后，需要加上break ，才能跳出这个switch语句
//
//在使用 switch 语句的时候，我们经常可能遇到一种情况，比如switch 后的表达式中的值无法匹
//配代码中的case 语句的时候，这时候要不就不做处理，要不就得在switch 语句中加入
//default 子句。
//switch 后边的expression 的结果不是value1 ，也不是value2 的时候，就会执行
//default 子句。
//
//switch语句中的case和default的顺序问题
//在switch 语句中case 子句和default 子句有要求顺序吗？ default 只能放在最后吗？
//其实，在switch 语句中case 语句和default 语句是没有顺序要求的，只要你的顺序是满足实
//际需求的就可以。
//不过我们通常是把default 子句放在最后处理的。
//
//
//
//
//while循环
//C语言提供了3种循环语句， while 就是其中一种，while 语句的语法结构和if 语句非常相似。
//
//if和 while的对比
//if (表达式)
//语句;
//
//while (表达式)
//语句;//如果循环体想包含更多的语句，可以加上大括号
//
//首先上来就是执行判断表达式，表达式的值为0，循环直接结束；表达式的值不为0，则执行循环语
//句，语句执行完后再继续判断，是否进行下一次判断。
//
//
//练习
//打印一到十的数字
//int main()
//{
//	int i = 1;
//	while (i <= 10)
//		printf("%d\n", i++);
//	
//		return 0;
//
//}


//练习
//输入一个正的整数，逆序打印这个整数的每一位
//例如：
//输入：1234，输出：4 3 2 1
//输入：521，输出：1 2 5
//
//
//题目解析
//1. 要想得到n的最低位，可以使用n % 10的运算，得到的余数就是最低位，如：1234 % 10得到4
//2. 要想去掉n的最低位，找出倒数第二位，则使用 n = n / 10 操作就可以去掉最低位的，如：
//n = 1234 / 10得到123，123相较于1234就去掉了最低位，123 % 10就得到倒数第二位3。
//3. 循环1和2两个步骤，在n变成0之前，就能到所有的位。
//
//#include <stdio.h>
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	while (n)
//	{
//		printf("%d ", n % 10);
//		n /= 10;
//	}
//	return 0;
//}




//for循环
//语法形式
//for 循环是三种循环中使用最多的， for 循环的语法形式如下：
//for (表达式1;//初始化表达式
//	表达式2; //判断表达式
//	表达式3)//调整
//	语句；//如果循环体想包含更多的语句，可以加上大括号
//	表达式1 用于循环变量的初始化
//	表达式2 用于循环结束条件的判断
//	表达式3 用于循环变量的调整
//	#include <stdio.h>
//int main()
//{
//	int i = 0;
//	for(i = 1;i<=10;i++)
//	{
//		printf("%d ", i);
//	}
//	return 0;
//}
//
//整个循环的过程中，表达式1初始化部分只被执行1次，剩下的就是表达式2、循环语句、表达式3在循
//环
//
//
//
//while循环和for循环的对比
//for 和while 在实现循环的过程中都有初始化、判断、调整这三个部分，但是for 循环的三个部
//分非常集中，便于代码的维护，而如果代码较多的时候while 循环的三个部分就比较分散，所以从形
//式上for 循环要更优一些。
//
//\
//
//计算1~100之间3的倍数的数字之和
//int main()
//{
//	int i = 0;
//	int sum = 0;
//	for (i = 1; i % 3; i++)
//	{
//		if (i % == 0)
//			sum += i;
//			
//	}
//	printf("%d\n", sum);
//      return 0;
//}
//
//do while循环
//语法形式
//在循环语句中do while 语句的使用最少，它的语法如下：
//do
//语句；
//while (表达式)；
//
//while 和for 这两种循环都是先判断，条件如果满足就进入循环，执行循环语句，如果不满足就跳
//出循环；
//而 do while 循环则是先直接进入循环体，执行循环语句，然后再执行 while 后的判断表达式，表
//达式为真，就会进行下一次，表达式为假，则不再继续循环。
//在do while 语句中循环体是至少执行一次的，这是do while 循环比较特殊的地方。
//一般do while 使用在循环体至少被执行一次的场景下，所以较少一些。
//
//
//break和continue语句
//在循环执行的过程中，如果某些状况发生的时候，需要提前终止循环，这是非常常见的现象。C语言中
//提供了break 和continue 两个关键字，就是应用到循环中的。
//• break 的作用是用于永久的终止循环，只要break 被执行，直接就会跳出循环，继续往后执
//行。
//• continue 的作用是跳过本次循环中continue 后边的代码，在for 循环和while 循环中有
//所差异的。